package com.briup.es.service.impl;

import com.briup.es.config.auth.UserDetails;
import com.briup.es.config.exception.ServiceException;
import com.briup.es.config.response.ResultCode;
import com.briup.es.domain.bean.Book;
import com.briup.es.domain.vo.BookDetailVO;
import com.briup.es.domain.vo.BookVO;
import com.briup.es.mapper.BookMapper;
import com.briup.es.service.BookService;
import com.briup.es.utils.AssertUtil;
import com.briup.es.utils.BeanUtil;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

@Service
public class BookServiceImpl implements BookService {

    @Resource
    private BookMapper bookMapper;

    @Override
    public List<BookVO> showBooks() {
        // 查询所有图书
        List<Book> books = bookMapper.queryAll();
        // 随机打乱图书顺序，打乱顺序可以使用集合工具类Collections中的shuffle()方法
        Collections.shuffle(books);
        // 获取所有图书中前20本图书，并且返回
        List<Book> bookList = books.stream()
                .limit(20)
                .collect(Collectors.toList());
        // bean转换，将List<Book>转换为 List<BookVO>
        return BeanUtil.bean2VOS(bookList, BookVO.class);
    }

    @Override
    public List<BookVO> findByCategory(Integer id) {
        // 根据id查询数据，先校验id是否可用
        AssertUtil.isTrue(id != null && id > 0,
                ResultCode.CATEGORY_ID_IS_INVALID);
        return bookMapper.findByCategory(id);
    }

    @Override
    public List<BookVO> searchBook(String query) {
        return bookMapper.searchBook(query);
    }

    @Override
    public BookDetailVO queryById(Integer id) {
        // 校验图书id是否有效
        AssertUtil.isTrue(id != null && id > 0,
                ResultCode.BOOK_ID_IS_INVALID);
        // 获取当前登录用户的id
        Integer userId = UserDetails.userId();
        // 根据图书id及用户id查询图书详情数据
        BookDetailVO bookDetailVO = bookMapper.queryByIdAndUserId(id, userId);

        // 如果查询的结果为null，那么抛出 图书不存在 的异常
        return Optional.ofNullable(bookDetailVO)
                .orElseThrow(() ->
                        new ServiceException(ResultCode.BOOK_IS_NOT_EXISTS));
    }
}

